package com.ktjy.cond;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Map;

/**
 * 自定义的注解
 *
 */
@Target({ElementType.TYPE, ElementType.METHOD}) // 下面注解是可以标识到类和方法上面
@Retention(RetentionPolicy.RUNTIME) // 标识当前注解的类型：RUNTIME运行时注解。 95%以上的注解都是这个类型
public @interface ConditionOnPropertyEnable {

    // 当配置文件中对应的属性值为true时，则需要创建bean
    String enableProperty();

    public class OnEnableCondition implements Condition {
        private static final Logger LOGGER = LoggerFactory.getLogger(OnEnableCondition.class);

        // matches方法会返回boolean，如果是true时，被标识的配置类中的方法就可以创建对象并注册到spring容器中
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            // 获取元数据中被标记的@ConditionOnPropertyEnable的所有配置值
            // @ConditionOnPropertyEnable(enableProperty = "true")，即得到注解中的配置值 —— enableProperty = "true"
            Map<String, Object> attrs = metadata.getAnnotationAttributes(ConditionOnPropertyEnable.class.getName());
            // 再从元素数据中获取enableProperty的值
            String enableProperty = (String)attrs.get("enableProperty");
            LOGGER.info("当前读取到属性名为：enableProperty: {}", enableProperty);
            // 再从环境中获取properties文件读取enableProperty对应的值
            String propertyValue = context.getEnvironment().getProperty(enableProperty);
            LOGGER.info("从配置文件中获取属性值为：{}={}", enableProperty, propertyValue);
            // 再将属性值转换成Boolean
            Boolean needRegister = Boolean.valueOf(propertyValue);
            LOGGER.info("标注的bean是否需要注册: {}", needRegister);
            return needRegister;  // true、false
        }
    }

}
